/*@author cerimice*/
package Dialogos.Entidad;

import cerimice.ComboLista;
import Sistema.Configuracion;
import Persistencia.Definicion.Cliente;
import Logica.Dialogo.Entidad.ClienteLogica;

import java.util.List;
import java.util.Arrays;
import java.util.logging.Logger;

import com.vaadin.ui.Table;
import com.vaadin.ui.Panel;
import com.vaadin.ui.Button;
import com.vaadin.ui.TextArea;
import com.vaadin.ui.TextField;
import com.vaadin.ui.Embedded;
import com.vaadin.ui.GridLayout;
import com.vaadin.data.Property;
import com.vaadin.ui.OptionGroup;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Window.Notification;
import com.vaadin.terminal.ThemeResource;
import com.vaadin.terminal.StreamResource;

import com.vaadin.ui.Window;
import com.vaadin.data.Property.ValueChangeEvent;


public class ClienteDlg extends Panel
    {
    private static final List<String> opcs = Arrays.asList(new String[] {"Nombre","Apellido Paterno","Apellido Materno"});
    
    private ClienteLogica logica;
    
    private OptionGroup opcion;
    private Table       tabla;
    private TextField   buscar,clave,nombre,paterno,materno,codigoPostal,telefonoFijo,telefonoMovil,email;
    private TextArea    direccion;
    private ComboLista  estado,municipio;
    private Button      mostrar;
    private Button      modificar,agregar,agenda;
    
    public ClienteDlg()
        {
        super();
        iniciarComponente();
        }
    
    private void iniciarComponente()
        {
        logica      = new ClienteLogica();
        
        opcion          = new OptionGroup("Por favor seleccione el campo de busqueda",opcs); opcion.select("Nombre");
        buscar          = new TextField("Proporcione dato a buscar");
        clave           = new TextField("Clave");   clave.setEnabled(false);
        nombre          = new TextField("Nombre");
        paterno         = new TextField("Apellido Paterno");
        materno         = new TextField("Apellido Materno");
        direccion       = new TextArea("Dirección");
        estado          = new ComboLista("Estado");
        municipio       = new ComboLista("Municipio");
        codigoPostal    = new TextField("Codigo Postal");
        telefonoFijo    = new TextField("Telefono Fijo");
        telefonoMovil   = new TextField("Telefono Movil");
        email           = new TextField("Email");
        
        mostrar     = new Button("Mostrar");
        modificar   = new Button("Modificar");
        agregar     = new Button("Agregar");
        agenda      = new Button("Agenda");
        tabla       = new Table("Listado de Clientes");
            tabla.addListener(new Property.ValueChangeListener()    {@Override public void valueChange(ValueChangeEvent event) {cargarInformacionSeleccionado();}});
            tabla.setNullSelectionAllowed(false);
            tabla.setSelectable(true);
            tabla.setImmediate(true);
            tabla.addContainerProperty("Clave",String.class,"");
            tabla.addContainerProperty("Nombre",String.class,"");
            tabla.addContainerProperty("Apellido Paterno",String.class,"");
            tabla.addContainerProperty("Apellido Materno",String.class,"");
            tabla.setColumnWidth("Clave",100);
            tabla.setColumnWidth("Nombre",150);
            tabla.setColumnWidth("Apellido Paterno",150);
            tabla.setColumnWidth("Apellido Materno",150);
            tabla.setWidth("100%");
            tabla.setHeight("150px");
        try
            {estado.addListItems(logica.generarListaEstado());}
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());}
        
        mostrar.addListener(new Button.ClickListener()  {@Override public void buttonClick(Button.ClickEvent event){cargarTabla();}});
        agregar.addListener(new Button.ClickListener(){@Override public void buttonClick(Button.ClickEvent event){agregarInformacion();}});
        agenda.addListener(new Button.ClickListener(){@Override public void buttonClick(Button.ClickEvent event){generarAgendaClientes();}});
        modificar.addListener(new Button.ClickListener(){@Override public void buttonClick(Button.ClickEvent event){modificarInformacionSeleccionado();}});
        estado.addListener(new Property.ValueChangeListener(){@Override public void valueChange(ValueChangeEvent event){eventoListaEstado();}});
        
        GridLayout layout = new GridLayout(4,4);
            VerticalLayout busqueda = new VerticalLayout();
                busqueda.addComponent(buscar);
                busqueda.addComponent(opcion);
                busqueda.addComponent(mostrar);
            layout.addComponent(busqueda,0,0,3,1);
            layout.addComponent(tabla,0,2,3,2);
            VerticalLayout componentes = new VerticalLayout();
                //componentes.setWidth("50%");
                HorizontalLayout datos = new HorizontalLayout();
                    datos.setCaption("Datos Personales");
                    datos.addComponent(clave);
                    datos.addComponent(nombre);
                    datos.addComponent(paterno);
                    datos.addComponent(materno);
                HorizontalLayout dir = new HorizontalLayout();
                    dir.setCaption("Datos de Dirección");
                    dir.addComponent(direccion);
                    dir.addComponent(estado);
                    dir.addComponent(municipio);
                    dir.addComponent(codigoPostal);
                HorizontalLayout contacto = new HorizontalLayout();
                    contacto.setCaption("Datos de Contacto");
                    contacto.addComponent(telefonoFijo);
                    contacto.addComponent(telefonoMovil);
                    contacto.addComponent(email);
                HorizontalLayout operaciones = new HorizontalLayout();
                    operaciones.addComponent(modificar);
                    operaciones.addComponent(agregar);
                    operaciones.addComponent(agenda);
            componentes.addComponent(datos);
            componentes.addComponent(dir);
            componentes.addComponent(contacto);
            componentes.addComponent(operaciones);
            layout.addComponent(componentes,0,3,3,3);
        this.addComponent(layout);
        this.setCaption("CATALOGO DE "+logica.getTitulo().toUpperCase());
        this.setIcon(new ThemeResource("icons/personal/cliente.png"));
        
        cargarTabla();
        estado.setSelectedKey("17");
        municipio.setSelectedKey("888");
        }
    
    private void limpiarDialogo()
        {
        clave.setValue("");
        nombre.setValue("");
        paterno.setValue("");
        materno.setValue("");
        direccion.setValue("");
        estado.setSelectedKey("17");
        municipio.setSelectedKey("888");
        codigoPostal.setValue("");
        telefonoFijo.setValue("");
        telefonoMovil.setValue("");
        email.setValue("");
        
        }
    
    private void cargarTabla()
        {
        try
            {
            int opc = 1;
            switch((String)opcion.getValue())
                {
                case "Nombre":              opc = 1; break;
                case "Apellido Paterno":    opc = 2; break;
                case "Apellido Materno":    opc = 3; break;
                }
            this.tabla = logica.generarTabla(opc,buscar.getValue().toString(),this.tabla);}
        catch (Exception ex)
            {
            /*getWindow().showNotification("Problemas...","Error al procesar la información, por favor intentelo nuevamente<br>"+ex.getMessage(),Notification.TYPE_ERROR_MESSAGE);*/
            Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());
            }
        }
    
    private void eventoListaEstado()
        {
        try
            {
            String edo = estado.getSelectedKey();
            municipio.addListItems(logica.generarListaMunicipio(edo));
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());}
        
        }
    
    private void cargarInformacionSeleccionado()
        {
        agregar.setEnabled(false);
        String clv = tabla.getValue().toString();
        try
            {
            Cliente obj = logica.obtenerObjeto(clv);
            clave.setValue(obj.getClave());
            nombre.setValue(obj.getNombre());
            paterno.setValue(obj.getPaterno());
            materno.setValue(obj.getMaterno());
            direccion.setValue(obj.getDireccion());
            estado.setSelectedKey(""+obj.getEstado());
            municipio.setSelectedKey(""+obj.getMunicipio());
            codigoPostal.setValue(obj.getCodigoPostal());
            telefonoFijo.setValue(obj.getTelefonoFijo());
            telefonoMovil.setValue(obj.getTelefonoMovil());
            email.setValue(obj.getEmail());
            }
        catch (Exception ex)
            {getWindow().showNotification("Problemas...","Error al procesar la información, por favor intentelo nuevamente<br>Mensaje: "+ex.getMessage(),Notification.TYPE_ERROR_MESSAGE);}
        }
    
    private void modificarInformacionSeleccionado()
        {
        if(tabla.getValue()==null){{getWindow().showNotification("Aviso...","Por favor selecciona un elemento de la tabla",Notification.TYPE_WARNING_MESSAGE);} return;}
        String clv = tabla.getValue().toString();
        try
            {
            String  claveDts         = clave.getValue().toString();
            String  nombreDts        = nombre.getValue().toString();
            String  paternoDts       = paterno.getValue().toString();
            String  maternoDts       = materno.getValue().toString();
            String  direccionDts     = direccion.getValue().toString();
            String  estadoDts        = estado.getSelectedKey();
            String  municipioDts     = municipio.getSelectedKey();
            String  codigoPostalDts  = codigoPostal.getValue().toString();
            String  telefonoFijoDts  = telefonoFijo.getValue().toString();
            String  telefonoMovilDts = telefonoMovil.getValue().toString();
            String  emailDts         = email.getValue().toString();
            
            if(logica.modificarObjeto(claveDts,nombreDts,paternoDts,maternoDts,direccionDts,estadoDts,municipioDts,codigoPostalDts,telefonoFijoDts,telefonoMovilDts,emailDts))
                {
                limpiarDialogo();
                getWindow().showNotification("Modificación...","Información procesada correctamente",Notification.TYPE_TRAY_NOTIFICATION);
                cargarTabla();
                }
            else
                {getWindow().showNotification("Modificación...",logica.getError(),Notification.TYPE_WARNING_MESSAGE);}
            }
        catch (Exception ex)
            {getWindow().showNotification("Problemas...","Error al procesar la información, por favor intentelo nuevamente<br>Mensaje: "+ex.getMessage(),Notification.TYPE_ERROR_MESSAGE);}
        }
    
    private void agregarInformacion()
        {
        try
            {
            String  nombreDts        = nombre.getValue().toString();
            String  paternoDts       = paterno.getValue().toString();
            String  maternoDts       = materno.getValue().toString();
            String  direccionDts     = direccion.getValue().toString();
            String  estadoDts        = estado.getSelectedKey();
            String  municipioDts     = municipio.getSelectedKey();
            String  codigoPostalDts  = codigoPostal.getValue().toString();
            String  telefonoFijoDts  = telefonoFijo.getValue().toString();
            String  telefonoMovilDts = telefonoMovil.getValue().toString();
            String  emailDts         = email.getValue().toString();
            if(logica.agregarObjeto(nombreDts,paternoDts,maternoDts,direccionDts,estadoDts,municipioDts,codigoPostalDts,telefonoFijoDts,telefonoMovilDts,emailDts))
                {
                limpiarDialogo();
                getWindow().showNotification("Agregar...","Información procesada correctamente",Notification.TYPE_TRAY_NOTIFICATION);
                cargarTabla();
                }
            else
                {getWindow().showNotification("Agregar...",logica.getError(),Notification.TYPE_WARNING_MESSAGE);}
            }
        catch (Exception ex)
            {getWindow().showNotification("Problemas...","Error al procesar la información, por favor intentelo nuevamente<br>Mensaje: "+ex.getMessage(),Notification.TYPE_ERROR_MESSAGE);}
        }
    
    private void generarAgendaClientes()
        {
        try
            {
            Window window = new Window();
                ((VerticalLayout) window.getContent()).setSizeFull();
                window.setResizable(true);
                window.setWidth("800");
                window.setHeight("600");
                window.center();
            Embedded e = new Embedded();
                e.setSizeFull();
                e.setType(Embedded.TYPE_BROWSER);
            StreamResource resource = new StreamResource(logica.reporteGenerarAgendaCliente(), "AgendaCliente"+System.currentTimeMillis()+".pdf",this.getApplication());
                resource.setMIMEType("application/pdf");
                e.setSource(resource);
            window.addComponent(e);
            this.getApplication().getMainWindow().addWindow(window);
            }
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage());}
        }
    }
